package br.com.digidata.modelo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import br.com.digidata.negocio.*;

public class MedicoDAO {

    private Connection conn;

    private int lastInsertId() {
        int id = -1;

        try {

            PreparedStatement stmt = conn.prepareStatement("SELECT last_insert_id() AS id");

            ResultSet rs = stmt.executeQuery();

            rs.next();

            id = rs.getInt("id");

            rs.close();
            stmt.close();

        } catch (Exception e) {
            System.out.println("Id medico: " + new java.util.Date() + " " + e);
        }

        return id;
    }

    public boolean insert(Medico m) {
        conn = ConexaoBD.getConnection();
        boolean retorno = false;

        try {
            PreparedStatement pstmtEndereco = conn.prepareStatement("INSERT INTO endereco "
                    + "(logradouro, numero, complemento, bairro, cidade, estado, cep) "
                    + "values (?,?,?,?,?,?,?)");

            pstmtEndereco.setString(1, m.getEndereco().getLogradouro());
            pstmtEndereco.setInt(2, m.getEndereco().getNumero());
            pstmtEndereco.setString(3, m.getEndereco().getComplemento());
            pstmtEndereco.setString(4, m.getEndereco().getBairro());
            pstmtEndereco.setString(5, m.getEndereco().getCidade());
            pstmtEndereco.setString(6, m.getEndereco().getEstado());
            pstmtEndereco.setString(7, m.getEndereco().getCep());

            pstmtEndereco.executeUpdate();

            PreparedStatement pstmtMedico = conn.prepareStatement("INSERT INTO medico "
                    + "(endereco_id, cpf, nome, data_nascimento, sexo, telefone_residencial, "
                    + "telefone_celular, crm, especialidade) "
                    + "values (?,?,?,?,?,?,?,?,?)");

            pstmtMedico.setInt(1, this.lastInsertId());
            pstmtMedico.setString(2, m.getCpf());
            pstmtMedico.setString(3, m.getNome());
            pstmtMedico.setString(4, m.getDataNascimento());
            pstmtMedico.setString(5, m.getSexo());
            pstmtMedico.setString(6, m.getTelefoneResidencial());
            pstmtMedico.setString(7, m.getTelefoneCelular());
            pstmtMedico.setInt(8, m.getCrm());
            pstmtMedico.setString(9, m.getEspecialidade());

            pstmtMedico.executeUpdate();

            retorno = true;

            pstmtEndereco.close();
            pstmtMedico.close();
            conn.close();
        } catch (SQLException e) {
            System.out.println("Incluir medico: " + new java.util.Date() + " " + e);
        }
        return retorno;
    }

    public void update(Medico m) {
        try {
            conn = ConexaoBD.getConnection();

            PreparedStatement stmt = conn.prepareStatement("UPDATE medico SET nome = ?, especialidade = ?, telefone_celular = ? WHERE id = ? ");
            stmt.setString(1, m.getNome());
            stmt.setString(2, m.getEspecialidade());
            stmt.setString(3, m.getTelefoneCelular());
            stmt.setInt(4, m.getId());
            stmt.executeUpdate();

            stmt.close();
            conn.close();

        } catch (Exception e) {
            System.out.println("Alterar medico: " + new java.util.Date() + " " + e);
        }
    }

    public List<Medico> retrive() {
        List<Medico> medicos = new ArrayList<Medico>();

        try {
            conn = ConexaoBD.getConnection();

            Statement stmt = conn.createStatement();

            ResultSet rs = stmt.executeQuery("SELECT * FROM medico m JOIN endereco e ON m.endereco_id = e.id");

            while (rs.next()) {
                Endereco endereco = new Endereco(rs.getInt("endereco_id"),
                        rs.getString("logradouro"),
                        rs.getInt("numero"),
                        rs.getString("complemento"),
                        rs.getString("bairro"),
                        rs.getString("cidade"),
                        rs.getString("estado"),
                        rs.getString("cep"));

                Medico medico = new Medico(rs.getInt("id"),
                        rs.getString("cpf"),
                        rs.getString("nome"),
                        rs.getString("data_nascimento"),
                        rs.getString("sexo"),
                        rs.getString("telefone_residencial"),
                        rs.getString("telefone_celular"),
                        endereco,
                        rs.getInt("crm"),
                        rs.getString("especialidade"));

                medicos.add(medico);
            }

            rs.close();
            stmt.close();
            conn.close();

        } catch (Exception e) {
            System.out.println("Listar medicos: " + new java.util.Date() + " " + e);
        }

        return medicos;
    }

    public Medico getById(int id) {

        Medico medico = null;

        try {
            conn = ConexaoBD.getConnection();

            PreparedStatement stmt = conn.prepareStatement("SELECT * FROM medico m JOIN endereco e ON m.endereco_id = e.id WHERE m.id = ? ");
            stmt.setInt(1, id);

            ResultSet rs = stmt.executeQuery();

            rs.next();

            Endereco endereco = new Endereco(rs.getInt("id"),
                    rs.getString("logradouro"),
                    rs.getInt("numero"),
                    rs.getString("complemento"),
                    rs.getString("bairro"),
                    rs.getString("cidade"),
                    rs.getString("estado"),
                    rs.getString("cep"));

            medico = new Medico(rs.getInt("id"),
                    rs.getString("cpf"),
                    rs.getString("nome"),
                    rs.getString("data_nascimento"),
                    rs.getString("sexo"),
                    rs.getString("telefone_residencial"),
                    rs.getString("telefone_celular"),
                    endereco,
                    rs.getInt("crm"),
                    rs.getString("especialidade"));

            rs.close();
            stmt.close();
            conn.close();

        } catch (Exception e) {
            System.out.println("Pegar medicos: " + new java.util.Date() + " " + e);
        }

        return medico;
    }
    
    public void delete(Medico m) {
        try {
            conn = ConexaoBD.getConnection();

            PreparedStatement stmt = conn.prepareStatement("DELETE FROM medico WHERE id = ? ");
            stmt.setInt(1, m.getId());
            stmt.executeUpdate();

            stmt.close();
            conn.close();

        } catch (Exception e) {
            System.out.println("Apagar medico: " + new java.util.Date() + " " + e);
        }
    }
    
    public List<Medico> search(String valor) {
        List<Medico> medicos = new ArrayList<Medico>();

        try {
            conn = ConexaoBD.getConnection();

            PreparedStatement stmt = conn.prepareStatement("SELECT * FROM medico p JOIN endereco e ON p.endereco_id = e.id " +
            		"WHERE p.nome like ? or p.especialidade like ? or p.telefone_celular like ? ");
            stmt.setString(1, "%" + valor + "%");
            stmt.setString(2, "%" + valor + "%");
            stmt.setString(3, "%" + valor + "%");

            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                Endereco endereco = new Endereco(rs.getInt("id"),
                        rs.getString("logradouro"),
                        rs.getInt("numero"),
                        rs.getString("complemento"),
                        rs.getString("bairro"),
                        rs.getString("cidade"),
                        rs.getString("estado"),
                        rs.getString("cep"));

                Medico medico = new Medico(rs.getInt("id"),
                        rs.getString("cpf"),
                        rs.getString("nome"),
                        rs.getString("data_nascimento"),
                        rs.getString("sexo"),
                        rs.getString("telefone_residencial"),
                        rs.getString("telefone_celular"),
                        endereco,
                        rs.getInt("crm"),
                        rs.getString("especialidade"));

                medicos.add(medico);
            }

            rs.close();
            stmt.close();
            conn.close();

        } catch (Exception e) {
            System.out.println("Procurar medico: " + new java.util.Date() + " " + e);
        }

        return medicos;
    	
    }    
}
